// 策略模式-使用简单数组作为策略容器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/// @brief 策略对象
typedef struct
{
	char name[100];		// 策略名
	void (*strategy)(); // 对应的策略回调函数
} Strategy, *StrategyContainer;

/// @brief 全局的策略容器对象，是个数组，简单起见这里使用数组存放每个策略，可以改用哈希表
static StrategyContainer container;

// 列出全部策略的执行函数
void printA()
{
	printf("input A\n");
}

void printB()
{
	printf("input B\n");
}

void printC()
{
	printf("input C\n");
}

/// @brief 初始化策略，需要在主函数开始时执行
void init()
{
	container = (Strategy *)calloc(3, sizeof(Strategy));
	strcpy(container[0].name, "a");
	container[0].strategy = printA;
	strcpy(container[1].name, "b");
	container[1].strategy = printB;
	strcpy(container[2].name, "c");
	container[2].strategy = printC;
}

/// @brief 执行策略函数
/// @param name 要执行的策略名
void doStrategy(char name[])
{
	int i;
	for (i = 0; i < 3; i++)
	{
		if (strcmp(container[i].name, name) == 0)
		{
			container[i].strategy();
			return;
		}
	}
	printf("No such strategy!");
}

int main()
{
	init();
	char name[8];
	printf("请输入要执行的策略名(a, b, c)：\n");
	gets(name);
	doStrategy(name);
	return 0;
}